package de.hdu.pms.ho.dao;

import java.util.Date;
import java.util.List;

import javax.persistence.Id;

import org.hibernate.annotations.Parameter;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import de.hdu.pms.ho.model.Kunde;
import de.hdu.pms.ho.model.Zimmer;
import de.hdu.pms.ho.model.ZimmerKunde;

/**
 * {@link ZimmerDao} is will be used from {@link Kunde} to rent a {@link Zimmer} in the hotel
 * 
 * @author Hendrik Neumann
 *
 */
public class ZimmerKundeDao extends HibernateDaoSupport{
	

	
	/**
	 * Method for rent a {@link Zimmer} in the hotel
	 * 
	 * Following {@link Parameter} will be used
	 * 
	 * @param zimmer
	 * @param kunde
	 * @param reserviert
	 * @param belegt
	 * @param ausgecheckt
	 * @param anfang
	 * @param ende
	 * @param erstellt
	 */
	public void reservieren(Zimmer zimmer, Kunde kunde, boolean reserviert, boolean belegt, boolean ausgecheckt, String anfang, String ende, Date erstellt){
		HibernateTemplate template = getHibernateTemplate();
		ZimmerKunde zimkunde = new ZimmerKunde(zimmer, kunde, reserviert, belegt, ausgecheckt, anfang, ende, erstellt);

		template.persist(zimkunde);
		
		}
	public List<ZimmerKunde> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		List<ZimmerKunde> results = template.loadAll(ZimmerKunde.class);
		return (List<ZimmerKunde>) results; 
	}
	
	
	/**
	 * The method allows to pick a {@link ZimmerKunde} sorted by {@link Id}.
	 * This will be used for changing data.
	 * 
	 * @param id
	 * @return
	 */
	public ZimmerKunde findById(Integer id){
		HibernateTemplate template = getHibernateTemplate();
		return (ZimmerKunde) template.get(ZimmerKunde.class, id);
	}
	/**
	 * Saves a new {@link ZimmerKunde} in the database
	 * 
	 * @param zimmerkunde
	 * @return
	 */
	public ZimmerKunde save(ZimmerKunde zimmerkunde){
		HibernateTemplate template = getHibernateTemplate();
		template.saveOrUpdate(zimmerkunde);
		return zimmerkunde;
	}
	
	/*@SuppressWarnings("unchecked")
	public List<ZimmerKunde> findFreie(){
		SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
		Session session = sf.getCurrentSession();
		session.beginTransaction();	
		SQLQuery c = session.createSQLQuery("select * from zimmerkunde where belegt=false");
		c.addEntity("zimmerkunden", ZimmerKunde.class);
		List<ZimmerKunde> alleFreie = c.list();
		return alleFreie;
	}*/
	
	
/*	public void modify(Integer id, Integer kundeId, Integer zimmerId,Kunde kunde, Zimmer zimmer, boolean reserviert, boolean belegt, boolean ausgecheckt) {
		Kunde kunde = new Kunde();
		Zimmer zimmer = new Zimmer();
		kunde.setId(zimmerId);
		zimmer.setId(kundeId);
//		Session session = sessionFactory.getCurrentSession();
//		session.flush();
		HibernateTemplate template = getHibernateTemplate();
		ZimmerKunde zimkunde = (ZimmerKunde) template.get(ZimmerKunde.class, id);
		zimkunde.setKunde(kunde);
		zimkunde.setZimmer(zimmer);
		zimkunde.setReserviert(reserviert);
		zimkunde.setBelegt(belegt);
		zimkunde.setAusgecheckt(ausgecheckt);
		template.saveOrUpdate(zimkunde);
	}*/
	/**
	 * The method modify make it possible to change following {@link Parameter}
	 * 
	 * @param id
	 * @param zimmer
	 * @param kunde
	 * @param reserviert
	 * @param belegt
	 * @param ausgecheckt
	 * @param anfang
	 * @param ende
	 * @param erstellt
	 */
	public void modify(Integer id, Zimmer zimmer, Kunde kunde, boolean reserviert, boolean belegt, boolean ausgecheckt, String anfang, String ende, Date erstellt){
		HibernateTemplate template = getHibernateTemplate();
		ZimmerKunde zimkunde = (ZimmerKunde)template.get(ZimmerKunde.class, id);
		zimkunde.setKunde(kunde);
		zimkunde.setZimmer(zimmer);
		zimkunde.setReserviert(reserviert);
		zimkunde.setBelegt(belegt);
		zimkunde.setAusgecheckt(ausgecheckt);
		zimkunde.setAnfang(anfang);
		zimkunde.setEnde(ende);
		zimkunde.setErstellt(erstellt);
		template.saveOrUpdate(zimkunde);
	}

	/**
	 * Deletes a {@link ZimmerKunde} {@link Object}
	 * 
	 * @param zimmerkunde
	 */
	public void delete(ZimmerKunde zimmerkunde){
		HibernateTemplate template = getHibernateTemplate();
		template.delete(zimmerkunde);
		}
	
	
	/**
	 * Deletes a {@link ZimmerKunde} found by {@link Id}. 
	 * This method is uses because of the NestedServletException 
	 * 
	 * @param id
	 */
	public void deletebyId(Integer id){								//aufgrund der NestedServletException
		HibernateTemplate template = getHibernateTemplate();
		ZimmerKunde zk = findById(id);
		template.delete(zk);
		template.flush();
	}

}
